package br.com.mftc.efitness.beans;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.com.mftc.efitness.basicas.PerfilDeUsuario;
import br.com.mftc.efitness.basicas.Permissao;
import br.com.mftc.efitness.excecoes.ExcecaoBuscaSemResultados;
import br.com.mftc.efitness.excecoes.ExcecaoCamposObrigatoriosNaoPreenchidos;
import br.com.mftc.efitness.excecoes.ExcecaoCaracteresEspeciaisNaoSaoPermitidos;
import br.com.mftc.efitness.excecoes.ExcecaoGeral;
import br.com.mftc.efitness.excecoes.ExcecaoListaDeRegistrosDesatualizada;
import br.com.mftc.efitness.excecoes.ExcecaoNegocio;
import br.com.mftc.efitness.excecoes.ExcecaoRegistroDesatualizado;
import br.com.mftc.efitness.util.Variaveis;

@ManagedBean(name = "consultarPerfisDeUsuario")
@ViewScoped
public class ConsultarPerfisDeUsuarioBean {

	@ManagedProperty("#{mensagens}")
	private MensagensBean mensagens;
	
	@ManagedProperty("#{fachada}")
	private FachadaBean fachada;

	private List<PerfilDeUsuario> perfisDeUsuario, perfisDeUsuarioSelecionados;
	private PerfilDeUsuario perfilDeUsuarioSelecionado;
	private List<Permissao> permissoes;
	private String filtroNomePerfil;
	
	@PostConstruct
	public void inicializar() {
		filtroNomePerfil = new String("");
		
		consultarPerfisDeUsuario();
	}
	
	public void consultarPerfisDeUsuario() {
		try {
			perfisDeUsuario = fachada.consultarPerfisDeUsuarioPorNome(filtroNomePerfil);
		} catch (ExcecaoBuscaSemResultados excecao) {
			mensagens.addMensagem(FacesMessage.SEVERITY_INFO, excecao);
		} catch (ExcecaoCaracteresEspeciaisNaoSaoPermitidos | ExcecaoNegocio excecao) {
			mensagens.addMensagem(FacesMessage.SEVERITY_FATAL, excecao);
		}
	}
	
	public void alterarPerfilDeUsuario() {
		try {
			fachada.alterar(perfilDeUsuarioSelecionado);
			
			consultarPerfisDeUsuario();
			
			mensagens.addMensagem(FacesMessage.SEVERITY_INFO, Variaveis.TITULO_SUCESSO, Variaveis.CONSULTAR_PERFIS_DE_USUARIO_ALTERAR_MENSAGEM_SUCESSO);
		} catch (ExcecaoCamposObrigatoriosNaoPreenchidos | ExcecaoRegistroDesatualizado excecao) {
			mensagens.addMensagem(FacesMessage.SEVERITY_WARN, excecao);
		} catch (ExcecaoCaracteresEspeciaisNaoSaoPermitidos | ExcecaoNegocio | ExcecaoGeral excecao) {
			mensagens.addMensagem(FacesMessage.SEVERITY_FATAL, excecao);
		}
	}
	
	public void ativarPerfilDeUsuario(PerfilDeUsuario perfilDeUsuario) {
		try {
			if (!perfisDeUsuarioSelecionados.isEmpty()) {
				fachada.ativarListaDePerfisDeUsuario(perfisDeUsuarioSelecionados);
			} else {
				fachada.ativarPerfilDeUsuario(perfilDeUsuario);
			}
			
			consultarPerfisDeUsuario();
			
			mensagens.addMensagem(FacesMessage.SEVERITY_INFO, Variaveis.TITULO_SUCESSO, Variaveis.CONSULTAR_PERFIS_DE_USUARIO_ATIVAR_MENSAGEM_SUCESSO);
		} catch (ExcecaoRegistroDesatualizado | ExcecaoListaDeRegistrosDesatualizada excecao) {
			mensagens.addMensagem(FacesMessage.SEVERITY_WARN, excecao);
		} catch (ExcecaoNegocio | ExcecaoGeral excecao) {
			mensagens.addMensagem(FacesMessage.SEVERITY_FATAL, excecao);
		}
	}
	
	public void desativarPerfilDeUsuario(PerfilDeUsuario perfilDeUsuario) {
		try {
			if (!perfisDeUsuarioSelecionados.isEmpty()) {
				fachada.desativarListaDePerfisDeUsuario(perfisDeUsuarioSelecionados);
			} else {
				fachada.desativarPerfilDeUsuario(perfilDeUsuario);
			}
			
			consultarPerfisDeUsuario();
			
			mensagens.addMensagem(FacesMessage.SEVERITY_INFO, Variaveis.TITULO_SUCESSO, Variaveis.CONSULTAR_PERFIS_DE_USUARIO_DESATIVAR_MENSAGEM_SUCESSO);
		} catch (ExcecaoRegistroDesatualizado | ExcecaoListaDeRegistrosDesatualizada excecao) {
			mensagens.addMensagem(FacesMessage.SEVERITY_WARN, excecao);
		} catch (ExcecaoNegocio | ExcecaoGeral excecao) {
			mensagens.addMensagem(FacesMessage.SEVERITY_FATAL, excecao);
		}
	}
	
	public void removerPerfilDeUsuario(PerfilDeUsuario perfilDeUsuario) {
		try {
			if (!perfisDeUsuarioSelecionados.isEmpty()) {
				fachada.removerListaDePerfisDeUsuario(perfisDeUsuarioSelecionados);
			} else {
				fachada.removerPerfilDeUsuario(perfilDeUsuario);
			}
			
			consultarPerfisDeUsuario();
			
			mensagens.addMensagem(FacesMessage.SEVERITY_INFO, Variaveis.TITULO_SUCESSO, Variaveis.CONSULTAR_PERFIS_DE_USUARIO_REMOVER_MENSAGEM_SUCESSO);
		} catch (ExcecaoNegocio | ExcecaoGeral excecao) {
			mensagens.addMensagem(FacesMessage.SEVERITY_FATAL, excecao);
		}
	}
	
	public List<PerfilDeUsuario> getPerfisDeUsuario() {
		return perfisDeUsuario;
	}

	public void setPerfisDeUsuario(List<PerfilDeUsuario> perfisDeUsuario) {
		this.perfisDeUsuario = perfisDeUsuario;
	}
	
	public List<PerfilDeUsuario> getPerfisDeUsuarioSelecionados() {
		return perfisDeUsuarioSelecionados;
	}

	public void setPerfisDeUsuarioSelecionados(List<PerfilDeUsuario> perfisDeUsuarioSelecionados) {
		this.perfisDeUsuarioSelecionados = perfisDeUsuarioSelecionados;
	}

	public PerfilDeUsuario getPerfilDeUsuarioSelecionado() {
		return perfilDeUsuarioSelecionado;
	}

	public void setPerfilDeUsuarioSelecionado(PerfilDeUsuario perfilDeUsuarioSelecionado) {
		this.perfilDeUsuarioSelecionado = perfilDeUsuarioSelecionado;
	}

	public List<Permissao> getPermissoes() {
		if (permissoes == null) {
			try {
				setPermissoes(fachada.consultarPermissoes());
			} catch (ExcecaoNegocio excecao) {
				mensagens.addMensagem(FacesMessage.SEVERITY_FATAL, excecao);
			}
		}
		return permissoes;
	}

	public void setPermissoes(List<Permissao> permissoes) {
		this.permissoes = permissoes;
	}

	public String getFiltroNomePerfil() {
		return filtroNomePerfil;
	}

	public void setFiltroNomePerfil(String filtroNomePerfil) {
		this.filtroNomePerfil = filtroNomePerfil;
	}

	public MensagensBean getMensagens() {
		return mensagens;
	}

	public void setMensagens(MensagensBean mensagens) {
		this.mensagens = mensagens;
	}

	public FachadaBean getFachada() {
		return fachada;
	}

	public void setFachada(FachadaBean fachada) {
		this.fachada = fachada;
	}
}
